TypeScript+Gemini APIでサンプルコードを一通り試す
構成
Deno
.envファイルにGOOGLE_API_KEYを置く
code:readme.ts
import "jsr:@std/dotenv@0.225/load";
import { encodeBase64 } from "jsr:@std/encoding@1/base64";
import { map } from "jsr:@core/iterutil@0.9/async/map";
import {
GoogleGenerativeAI,
type InlineDataPart,
} from "npm:@google/generative-ai@0.21";
const genAI = new GoogleGenerativeAI(Deno.env.get("GOOGLE_API_KEY")!);
const model = genAI.getGenerativeModel({ model: "gemini-2.0-flash" });
defaultでmultimodalな入力も可能
code:readme.ts
const prompt = "Does this look store-bought or homemade?";
const image: InlineDataPart = {
inlineData: {
// いらすとやのクッキー
data: encodeBase64(
await (await fetch(
)).arrayBuffer(),
),
mimeType: "image/png",
},
};
途中経過がいらないときは、generateContentを使う
code:readme.ts
ReadableStream.from(map(result.stream, (chunk) => chunk.text()))
.pipeThrough(new TextEncoderStream())
.pipeTo(Deno.stdout.writable);
code:first-prompt.ts
import "jsr:@std/dotenv@0.225/load";
import { map } from "jsr:@core/iterutil@0.9/async/map";
import { GoogleGenerativeAI } from "npm:@google/generative-ai@0.21";
const genAI = new GoogleGenerativeAI(Deno.env.get("GOOGLE_API_KEY")!);
const flash = genAI.getGenerativeModel({ model: "gemini-2.0-flash" });
const result = await flash.generateContentStream(
"Explain AI to me like I'm a kid in Japanese.",
);
ReadableStream.from(map(result.stream, (chunk) => chunk.text()))
.pipeThrough(new TextEncoderStream())
.pipeTo(Deno.stdout.writable);
サンプルコードを全文書くの面倒になってきたので、ここからはsnippetだけ載せるtakker.icon
code:ts
const model = genAI.getGenerativeModel({
model: "gemini-2.0-flash",
generationConfig: { maxOutputTokens: 80 },
});
generationConfigに渡せば、色々設定できるみたいだ
code:ts
const model = genAI.getGenerativeModel({
model: "gemini-2.0-flash",
generationConfig: {
temperature: 1.0,
topK: 64,
topP: 0.95,
},
});
const result = await model.generateContentStream(
"You are a Japanese creative writer. Write a short story in Japanese about a cat who goes on an adventure.",
);
code:structured-output.ts
import "jsr:@std/dotenv@0.225/load";
import { map } from "jsr:@core/iterutil@0.9/async/map";
import {
GoogleGenerativeAI,
type ResponseSchema,
SchemaType,
} from "npm:@google/generative-ai@0.21";
const schema: ResponseSchema = {
description: "List of recipes",
type: SchemaType.ARRAY,
items: {
type: SchemaType.OBJECT,
properties: {
recipeName: {
type: SchemaType.STRING,
description: "Name of the recipe",
nullable: false,
},
ingredients: {
type: SchemaType.ARRAY,
items: {
type: SchemaType.STRING,
},
description: "List of ingredients",
nullable: false,
},
steps: {
type: SchemaType.ARRAY,
items: {
type: SchemaType.STRING,
},
description: "List of steps",
nullable: false,
}
},
},
};
const genAI = new GoogleGenerativeAI(Deno.env.get("GOOGLE_API_KEY")!);
const model = genAI.getGenerativeModel({
model: "gemini-2.0-flash",
generationConfig: {
temperature: 1.0,
topK: 64,
topP: 0.95,
application/jsonかtext/plainのどちらかのみ指定可能
code:structured-output.ts
responseMimeType: "application/json",
responseSchema: schema,
},
});
const result = await model.generateContentStream(
"You are a Japanese creative writer. Write a short story in Japanese about a cat who goes on an adventure.",
);
ReadableStream.from(map(result.stream, (chunk) => chunk.text()))
.pipeThrough(new TextEncoderStream())
.pipeTo(Deno.stdout.writable);
元コードはクッキーのレシピを指定していたが、kaggleのサンプルにある猫の物語を指示するpromptsをそのまま流用してみた
こうなった
code:json
[
{
"recipeName": "猫の冒険物語",
"ingredients": [
"好奇心",
"勇気",
"冒険心",
"猫のひげ",
"月の光"
],
"steps": [
"むかしむかし、ミケという名の猫がいました。ミケは、いつも窓から外の世界を眺めるのが好きでした。",
"ある夜、ミケは月の光に誘われ、初めて家を飛び出しました。",
"ミケは街を歩き回り、様々な匂いを嗅ぎ、新しい音を聞きました。",
"迷子になったミケは、途方に暮れましたが、勇気を振り絞って進みました。",
"やがて、ミケは優しいおばあさんに出会い、温かいミルクをもらいました。",
"おばあさんはミケを家に泊めてくれ、ミケは安心して眠りにつきました。",
"次の日、ミケはおばあさんと一緒に家を探し、無事に家に帰ることができました。",
"ミケは冒険を通して、少しだけ勇敢になり、外の世界への好奇心をさらに強くしました。"
]
}
]
強引に物語をレシピ形式にしてて笑うtakker.icon